#ifndef STRUCTUREDONNEES_HPP
#define STRUCTUREDONNEES_HPP

#include <QtCore/QMultiHash>
#include <QtCore/QHash>
#include <QtCore/QString>

/** Alias pour le type parent de @c StructureDonnees.
  */
typedef QMultiHash< QString, QHash< QString, QString > > BaseStructure;

/** Classe qui permet de stocker et échanger les informations récupérées depuis
  * les fichiers XML téléchargés.
  * Pour chaque balise on récupère la liste de ses attributs avec leur valeur.
  * Comme une balise donnée peut apparaître plusieurs fois, on utilise un
  * QMultiHash dont la clé est le nom de la balise. Pour chacune de ces balise
  * un QHash est utilisé, qui associe au nom de l'attribut (la clé) sa valeur.
  *
  * Cette structure particulière a comme origine le fait que les fichiers
  * fournis par l'API croquemonster ont une structure très simple : la balise
  * racine est la seule à avoir des balises enfants, qui eux-même ont des
  * attributs.
  *
  * @author Johan "Solo" Luisier
  * @date Octobre 2011
  */
class StructureDonnees : public BaseStructure
{
  //Q_OBJECT
public:
    /** Constructeur standard.
      * Initialise la classe mère.
      */
  StructureDonnees();
  /** Destructeur.
    * Le destructeur n'a rien de spécial à faire.
    */
  virtual ~StructureDonnees();
  /** Permet d'accéder au nombre de balises contenues dans le fichier.
    *
    * @retu le nombre d'éléments dans le QMultiHash.
    */
  int nombreElements() const;
  /** Permet d'accéder au nombre de balises d'un tel nom contenues dans le
    * fichier.
    *
    * @param[in] nomElement nom de la balise désirée.
    *
    * @return le nombre d'élément du QMultiHash dont la clé est @c nomElement.
    */
  int nombreElements( const QString& nomElement ) const;
  /** Permet d'accéder à la liste des attributs pour une balise donnée.
    * Puisqu'une balise peut apparaître de nombreuses fois dans un fichier XML,
    * il faut en plus du nom de cette balise donner un numéro.
    *
    * @param[in] nomElement nom de la balise souhaitée.
    * @param[in] numero numéro de la balise (càd 0 donnera la première occurence
    * de la balise souhaitée, 1 la deuxième, etc.).
    *
    * @return un pointeur sur la liste des attributs avec leur valeur pour la
    * balise désirée, ou 0 si la balise n'existe pas.
    *
    */
  const QHash< QString, QString >* listeAttributs( const QString& nomElement,
						   const int& numero = 0 )
    const;
  /** Permet d'accéder à la valeur d'un attribut pour une balise donnée.
    * Puisqu'une balise peut apparaître de nombreuses fois dans un fichier XML,
    * il faut en plus du nom de cette balise donner un numéro.
    *
    * @param[in] nomElement nom de la balise souhaitée.
    * @param[in] nomAttribut nom de l'attribut souhaité.
    * @param[in] numero numéro de la balise (càd 0 donnera la première occurence
    * de la balise souhaitée, 1 la deuxième, etc.).
    *
    * @return la valeur de l'atribut désiré, ou une instance vide de QString si
    * la balise ou l'attribut n'existe pas.
    */
  QString valeurAttribut( const QString& nomElement,
			  const QString& nomAttribut,
			  const int& numero = 0 ) const;
  /** Permet d'afficher le contenu de la structure de donnée.
    * Est utilisé à des fins de débugging, affiche pour chaque entrée du
    * QMultiHash la clé, puis tous les éléments de la valeur associée (càd les
    * paires attribut - valeur).
    */
  void afficheContenu() const;
};

#endif // STRUCTUREDONNEES_HPP
